展开完整参考实现
============================================================
股价涨跌幅监控系统
============================================================
cell-stock-monitoring-loop,用 for、continue 与 break 逐日扫描异常。金融市场产生海量时间序列数据——股价、成交量、收益率等。
for循环、while循环与循环控制语句| 模式 | 含义 | 金融场景适用性 |
|---|---|---|
| 迭代 | 重复执行相同操作 | ✅ 时间序列天然顺序性 |
| 递归 | 函数调用自身 | ❌ 内存消耗大 |
for循环用于遍历列表、元组、字符串等可迭代对象。
语法结构:
item:每次迭代取出的当前元素iterable:被遍历的序列对象# ==================== 示例1:遍历列表 ====================
stocks = ['中信证券', '国泰君安', '海通证券']
for stock in stocks:
print(f'分析股票: {stock}')
# ==================== 示例2:遍历字符串 ====================
code = '600519.SH'
for char in code:
print(char, end=' ')
print()
# ==================== 示例3:遍历范围 ====================
for i in range(5):
print(f'第{i+1}次迭代')
# ==================== 示例4:遍历字典 ====================
stock_info = {'name': '中信证券', 'code': '600030.SH', 'price': 24.78}
for key in stock_info:
print(f'{key}: {stock_info[key]}')分析股票: 中信证券
分析股票: 国泰君安
分析股票: 海通证券
6 0 0 5 1 9 . S H
第1次迭代
第2次迭代
第3次迭代
第4次迭代
第5次迭代
name: 中信证券
code: 600030.SH
price: 24.78
range()是循环中最常用的工具,用于生成整数序列。
三种调用方式:
| 语法 | 说明 | 示例 |
|---|---|---|
range(stop) |
从0到stop-1 | range(5) → 0,1,2,3,4 |
range(start, stop) |
从start到stop-1 | range(2020, 2025) |
range(start, stop, step) |
指定步长 | range(0, 10, 2) |
i = 0 i = 1 i = 2 i = 3 i = 4
年份: 2020
年份: 2021
年份: 2022
年份: 2023
年份: 2024
偶数: 0 偶数: 2 偶数: 4 偶数: 6 偶数: 8
倒计时: 10 倒计时: 9 倒计时: 8 倒计时: 7 倒计时: 6 倒计时: 5 倒计时: 4 倒计时: 3 倒计时: 2 倒计时: 1
np.arange可生成日期范围,常用于时间序列分析for循环可逐日处理金融数据while循环在条件为True时重复执行,适用于不确定迭代次数的情况。
语法结构:
False价格监控模拟:
第1天, 价格: 18.50元
第2天, 价格: 19.00元
第3天, 价格: 19.50元
第4天, 价格: 20.00元
达到目标价20元, 耗时4天
使用while循环时,必须确保:
False
count += 1 或 price += 0.5if days > 100: breakbreak语句立即跳出最内层循环,不执行循环体剩余代码。
执行逻辑:
break时,立即退出循环r_list 的业务含义、数据类型或取值范围,并判断哪一个输入最可能改变结果。运行后核对:核对 r_list 是否按预测参与运算,实际输出是否与预测一致;若不一致,先检查类型、单位、索引/字段和运算顺序。
拓展练习:只改变一个关键输入或业务场景,先预测输出如何变化,再运行验证并解释变化原因。
执行过程追踪:
0.0192 → 不满足 < -0.01,继续-0.0001 → 不满足,继续0.006 → 不满足,继续0.0074 → 不满足,继续-0.0127 → 满足! 执行break跳出关键知识点: 循环变量i在循环外仍可访问,保持最后一次赋值
| 场景 | 说明 |
|---|---|
| 达到风险提醒线 | 数据超过事先设定的范围时停止扫描并提示人工检查;不自动下单 |
| 异常检测 | 发现异常数据停止处理 |
| 检查完成 | 达到事先设定检查条件后退出循环并保存检查过程 |
break立即跳出最内层循环continue语句跳过当前迭代的剩余代码,直接进入下一次迭代。
正收益交易日:
第1个正收益日: 1.92%
第2个正收益日: 0.60%
第3个正收益日: 0.74%
第4个正收益日: 0.95%
总计正收益日: 4天
| 关键字 | 作用 | 后续代码 | 循环是否继续 |
|---|---|---|---|
break |
跳出整个循环 | 不执行 | ❌ 否 |
continue |
跳过本次迭代 | 不执行 | ✅ 是 |
break:发现目标或异常,停止循环continue:过滤数据,跳过不需要处理的部分Python循环可以带else子句:循环正常结束时执行,被break中断时不执行。
所有股票价格都在合理范围
==================================================
发现高价股票
elsebreak中断(发现异常)→ 跳过else综合运用for循环、if条件判断、break语句:
============================================================
股价涨跌幅监控系统
============================================================
for i, price in enumerate(prices, 1):
if i == 1:
daily_return = 0
else:
daily_return = (price - prices[i-2]) / prices[i-2]
return_pct = daily_return * 100
if daily_return < alert_threshold:
status = '⚠️ 阈值命中'; action = '进入风险核对'
elif daily_return > 0.01:
status = '✓ 正向变动'; action = '记录待检验'
else:
status = '区间内'; action = '继续记录'
print(f'第{i}天: 收盘价{price:.2f}元|涨跌幅{return_pct:+.2f}%|{status}→{action}') # 单行输出当日摘要以控制输出高度
if daily_return < alert_threshold:
print('\n' + '=' * 60)
print('课堂阈值满足条件,暂停并核对输入')
print('=' * 60)
break
else:
print('\n' + '=' * 60)
print('课堂路径遍历结束,未满足条件既定阈值')
print('=' * 60)第1天: 收盘价20.00元|涨跌幅+0.00%|区间内→继续记录
第2天: 收盘价19.90元|涨跌幅-0.50%|区间内→继续记录
第3天: 收盘价20.10元|涨跌幅+1.01%|✓ 正向变动→记录待检验
第4天: 收盘价19.82元|涨跌幅-1.39%|⚠️ 阈值命中→进入风险核对
============================================================
课堂阈值满足条件,暂停并核对输入
============================================================
注:示例序列没有达到 −1% 的提醒线;把提醒线改为 −0.3% 后再次运行,可以看到循环在首次预警时结束。
处理多只股票 × 多个交易日的数据时,需要使用嵌套循环。
执行逻辑:
returns = [
[0.01, 0.02, -0.01, 0.03, 0.02], # 股票A
[0.02, -0.01, 0.03, 0.01, -0.02], # 股票B
[-0.01, 0.03, 0.02, -0.02, 0.01] # 股票C
]
stock_names = ['股票A', '股票B', '股票C']
print('每日正收益股票统计:\n')
for day in range(5):
positive_count = 0
positive_stocks = []
for stock_idx in range(3):
if returns[stock_idx][day] > 0:
positive_count += 1
positive_stocks.append(stock_names[stock_idx])
print(f'第{day+1}天: {positive_count}只上涨 → {", ".join(positive_stocks)}')每日正收益股票统计:
第1天: 2只上涨 → 股票A, 股票B
第2天: 2只上涨 → 股票A, 股票C
第3天: 2只上涨 → 股票B, 股票C
第4天: 2只上涨 → 股票A, 股票B
第5天: 2只上涨 → 股票A, 股票C
# 方法1:Python for循环
start = time.time()
result_loop = []
for i in range(n):
result_loop.append(list1[i] + list2[i])
loop_time = time.time() - start
# 方法2:列表推导
start = time.time()
result_listcomp = [list1[i] + list2[i] for i in range(n)]
listcomp_time = time.time() - start
# 方法3:zip+列表推导
start = time.time()
result_zip = [a + b for a, b in zip(list1, list2)]
zip_time = time.time() - start# 方法4:NumPy向量化
arr1 = np.array(list1)
arr2 = np.array(list2)
start = time.time()
result_numpy = arr1 + arr2
numpy_time = time.time() - start
print(f'Python循环: {loop_time:.4f}秒')
print(f'列表推导: {listcomp_time:.4f}秒')
print(f'zip方法: {zip_time:.4f}秒')
print(f'NumPy向量化: {numpy_time:.4f}秒')
safe_numpy_time = numpy_time if numpy_time > 0 else 1e-12
assert result_loop == result_listcomp == result_zip == result_numpy.tolist()
print(f'\n当前环境本次循环/NumPy耗时比: {loop_time/safe_numpy_time:.1f};不外推固定倍数')
#print(f'\n最快方法比最慢快 {loop_time/numpy_time:.1f}倍')Python循环: 0.0126秒
列表推导: 0.0080秒
zip方法: 0.0052秒
NumPy向量化: 0.0004秒
当前环境本次循环/NumPy耗时比: 28.3;不外推固定倍数
| 方法 | 速度 | 适用场景 |
|---|---|---|
for循环 |
最慢 | 简单逻辑、学习阶段 |
| 列表推导 | 较快 | 中等规模数据 |
zip+推导 |
较快 | 多列表并行操作 |
| NumPy向量化 | 常在同类数值批处理上更快 | 先基准测试规模、内存与可读性 |
| 知识点 | 关键语法 | 金融场景 |
|---|---|---|
for循环 |
for x in seq: |
遍历股票列表 |
while循环 |
while cond: |
价格监控 |
break |
跳出循环 | 达到风险提醒线后停止并检查 |
continue |
跳过当前迭代 | 过滤异常数据 |
for-else |
正常结束执行else | 数据完整性验证 |
| 嵌套循环 | 双层for |
多股票多日分析 |
cell-stock-monitoring-loop,用 for、continue 与 break 逐日扫描异常。break 首次预警:解释与拓展应用答案:循环允许保留顺序并提前停止,大规模无状态筛选更适合向量化;拓展应用到长三角行情时用布尔掩码首个 True 核对,阈值须由风险制度批准。
所用数据与字段:逐日收益率,绝对值阈值3%
参考代码或推导(平台保护块之外):
[商业大数据分析与应用]